package com.itheima.homework;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/*
    请编写程序，不使用任何同步技术，模拟三个窗口同时卖100张票的情况，运行并打印结果，观察到错误的数据，并解释出现错误的原因。

    100张票

    窗口1      窗口2        窗口3
    1          3            2
    4          ...

 */
public class Test1 {
    public static void main(String[] args) {
        // 创建任务类对象
        Ticket ticket = new Ticket();

        // 创建三条线程
        new Thread(ticket, "窗口1").start();
        new Thread(ticket, "窗口2").start();
        new Thread(ticket, "窗口3").start();

    }
}

// 第一售票厅任务类
class Ticket implements Runnable {
    // 定义一百张票
    private int ticket = 100;
    private static final Object obj = new Object();
    private static final Lock LOCK = new ReentrantLock();

    // 任务方法
    @Override
    public void run() {
        while (true) {
            try {
                LOCK.lock();
                if (ticket <= 0) {
                    break;
                } else {
                    ticket--;// 卖出一张票
                    System.out.println(Thread.currentThread().getName() + "卖出了一张票.剩余" + ticket + "张");
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                LOCK.unlock();
            }
        }
    }

//    // 任务方法
//    @Override
//    public void run() {
//        while (true) {
//            if (method()){
//                break;
//            }
//        }
//    }
//
//    private synchronized boolean method() {
//        if (ticket <= 0) {
//            return true;
//        } else {
//            ticket--;// 卖出一张票
//            System.out.println(Thread.currentThread().getName() + "卖出了一张票.剩余" + ticket + "张");
//            return false;
//        }
//
//    }

//    // 任务方法
//    @Override
//    public void run() {
//        while (true) {
//            synchronized (obj) {
//                if (ticket <= 0) {
//                    break;
//                } else {
//                    ticket--;// 卖出一张票
//                    System.out.println(Thread.currentThread().getName() + "卖出了一张票.剩余" + ticket + "张");
//                }
//            }
//        }
//    }
}
